/*******************************************************************************
    Universidad del Valle de Guatemala
    Algoritmos y estructuras de datos
    Karen Tojin   08091
    Fecha: 30 de Julio de 2009
    Descricion: Programa que simula un banco, con el uso de colas
***************************************************************************** */
/**
 *
 * @author karenAndy
 */
public class ListaCircular<Type>{

    protected Nodo<Type> tail; // ref. al último elemento
    protected Nodo<Type> head; // ref. al último elemento

    public ListaCircular(){
    // post: genera una lista circular vacía
        tail = head = null;
    }

    public void PushInicio(Object newPerson){
    //post: agrega un elemento al inicio de la cola
        if(head == null){
            tail = head = new Nodo<Type>((Type) newPerson, head);
        }
        else{
            head = new Nodo<Type>((Type) newPerson, head);
            tail.nextElement = head;
        }
    }

    public void PushFinal(Object newPerson){
    // post: agrega un elemento al final de la cola
        if(head == null){
            PushInicio(newPerson);
        }
        else{
            tail.nextElement = new Nodo<Type>((Type) newPerson, head);
            tail = tail.nextElement;
        }
    }

    public Object PopPrimero(){
    // pre: la lista no está vacía
    // post: quita y devuelve el último elemento que ingresó a la lista
        if(head == null){
            return null;
        }
        if(head == tail){
            Type temp = head.data;
            head = tail = null;
            return temp;
        }
        else{
            Type temp = head.data;
            head = head.nextElement;
            tail.nextElement = head;
            return temp;
        }
    }

    public Object Peek(){
    // pre: la lista no está vacía
    // post: devuelve el último valor ingresado a la lista
        if(head == null)
            return null;
        else
            return head.data;
    }

}
